package config

import (
	"fmt"
	"strings"
)

type DatabaseConfig struct {
	Host     string `yaml:"host"`
	Port     int    `yaml:"port"`
	Username string `yaml:"username"`
	Password string `yaml:"password"`
	Database string `yaml:"database"`
	Charset  string `yaml:"charset"`
}

type GenerateConfig struct {
	Model      *bool `yaml:"model"`
	Repository *bool `yaml:"repository"`
	Service    *bool `yaml:"service"`
	Controller *bool `yaml:"controller"`
	Router     *bool `yaml:"router"`
}

type TableConfig struct {
	Name        string         `yaml:"name"`
	ModelName   string         `yaml:"model_name"`
	PackageName string         `yaml:"package_name"`
	Generate    GenerateConfig `yaml:"generate"`
}

type GeneratorConfig struct {
	Database  DatabaseConfig `yaml:"database"`
	Generator struct {
		Overwrite      bool          `yaml:"overwrite"`
		OutputBasePath string        `yaml:"output_base_path"`
		ProjectModule  string        `yaml:"project_module"`
		Tables         []TableConfig `yaml:"tables"`
		GenerateAll    bool          `yaml:"generate_all"` // 是否生成所有表
	} `yaml:"generator"`
}

func (c *GeneratorConfig) GetDSN() string {
	return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local",
		c.Database.Username,
		c.Database.Password,
		c.Database.Host,
		c.Database.Port,
		c.Database.Database,
		c.Database.Charset)
}

// 为 TableConfig 添加默认值设置方法
func (t *TableConfig) ApplyDefaults() {
	// 如果没有配置 ModelName，根据表名自动生成驼峰命名
	if t.ModelName == "" {
		t.ModelName = ToCamelCase(t.Name)
	}

	// 如果没有配置 PackageName，使用默认值
	if t.PackageName == "" {
		t.PackageName = "models"
	}

	// 应用 Generate 配置的默认值
	t.Generate.ApplyDefaults()
}

// 为 GenerateConfig 添加默认值设置方法
func (g *GenerateConfig) ApplyDefaults() {
	// 如果任何字段为 nil，设置为 true（默认生成所有组件）
	if g.Model == nil {
		defaultTrue := true
		g.Model = &defaultTrue
	}
	if g.Repository == nil {
		defaultTrue := true
		g.Repository = &defaultTrue
	}
	if g.Service == nil {
		defaultTrue := true
		g.Service = &defaultTrue
	}
	if g.Controller == nil {
		defaultTrue := true
		g.Controller = &defaultTrue
	}
	if g.Router == nil {
		defaultTrue := true
		g.Router = &defaultTrue
	}
}

// 获取布尔值的辅助方法
func (g *GenerateConfig) GetModel() bool {
	if g.Model == nil {
		return true
	}
	return *g.Model
}

func (g *GenerateConfig) GetRepository() bool {
	if g.Repository == nil {
		return true
	}
	return *g.Repository
}

func (g *GenerateConfig) GetService() bool {
	if g.Service == nil {
		return true
	}
	return *g.Service
}

func (g *GenerateConfig) GetController() bool {
	if g.Controller == nil {
		return true
	}
	return *g.Controller
}

func (g *GenerateConfig) GetRouter() bool {
	if g.Router == nil {
		return true
	}
	return *g.Router
}

// 辅助函数：转换下划线命名到驼峰命名
func ToCamelCase(snake string) string {
	if snake == "" {
		return "Model"
	}

	// 处理复数形式，转换为单数
	singular := toSingular(snake)

	parts := strings.Split(singular, "_")
	for i := 0; i < len(parts); i++ {
		if len(parts[i]) > 0 {
			// 首字母大写
			parts[i] = strings.ToUpper(parts[i][:1]) + parts[i][1:]
		}
	}
	return strings.Join(parts, "")
}

// 简单的单数化处理
func toSingular(word string) string {
	// 简单规则：如果以s结尾且长度大于1，去掉s
	if len(word) > 1 && strings.HasSuffix(word, "s") {
		return word[:len(word)-1]
	}
	return word
}
